import { Injectable } from '@nestjs/common';
import { FindOneOptions, Repository } from 'typeorm';
import { DeepPartial } from 'typeorm/common/DeepPartial';
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';

@Injectable()
export abstract class MysqlBaseService<T> {
  protected constructor(protected repository: Repository<T>) {}

  async findAll(): Promise<T[]> {
    return this.repository.find();
  }

  async findOne(options: FindOneOptions<T>): Promise<T> {
    return this.repository.findOne(options);
  }

  async create(createUserDto: DeepPartial<T>) {
    return await this.repository.save(createUserDto);
  }

  async update(id: number, updateUserDto: QueryDeepPartialEntity<T>) {
    return await this.repository.update(id, updateUserDto);
  }

  async delete(id: number) {
    return await this.repository.delete(id);
  }
}

/**
 * save and create
 * save： 可将实体实例（或普通对象）保存到数据库。如果实体已存在（如包含主键值），则更新记录；否则插入新记录。
 * create ：
 *  不直接操作数据库：仅生成实体实例，不会立即保存到数据库。
 *  处理默认值和转换：若实体定义了字段的默认值（如 @Column({ default: 'value' })）或类型转换（如 @Column({ type: 'timestamp' })），create 方法会应用这些规则。
 *  返回实体对象：生成的实例可以直接传递给 save 方法保存。
 *
 */
